#pragma once

#include "SortFunction.h"
#include <vector>
#include <string>
#include <string.h>
#include <thread>

namespace qb{
	namespace ht{
		typedef double TaskTime;
		enum kTaskTime{			// 用于统计多线程快排的性能
			kTaskTimeCommit,	// 提交时间:分配任务的时刻
			kTaskTimeBegin,		// 开始时间:线程拿到任务开始执行的时刻
			kTaskTimeFinish,	// 完成时间:线程完成任务的时刻
			kTaskTimeCount		// 
		};
		struct SortTask{
			ThreadSorter*	sorter;		// 将会调用sorter
			char*			base;		//
			int				width;		//
			unsigned int	left;		//
			unsigned int	right;		//
			bool			finished;	// 该 任务是否已经完成
			FuncCompColumn	comp_func;	//
            int             taskid;
            unsigned long   threadid;	// 由哪个线程来排序
			TaskTime		timepoints[kTaskTimeCount];
			SortTask(){ memset(this, 0, sizeof(SortTask)); }
			SortTask(ThreadSorter* ts, char* b, int w, unsigned int p, unsigned int r, FuncCompColumn comp);
			void Init(ThreadSorter* ts, char* b, int w, unsigned int p, unsigned int r, FuncCompColumn comp);
		};


		class TaskCache{
			enum{ THREAD_CACHE_SIZE = 128 };		// 
			SortTask				m_stack[THREAD_CACHE_SIZE];
			int						m_used_count;	// 下一个分派排序段的id，诸葛递增，超过此值表明该SortThreadPara是new出来的
            std::vector<SortTask*>	m_tasks;		// 正在被后台线程处理的
			SortTask*				m_first_task;	// 标记哪个最开始的排序段，这个交给主线程来处理
		public:
			TaskCache();
			~TaskCache();
			SortTask* GetTask(ThreadSorter* ts, char* base, int w, int l, int r, FuncCompColumn comp);
			SortTask* GetFirstTask(){ return m_first_task; }
			int  GetWaitTaskCount(){ return m_tasks.size(); }
			void AddWaitTask(SortTask* task, bool first);
			void Reset();
			void WaitAllFinish();
			void Report();
		};
	}//namespace ht
}//namespace qb
